/* ************************************************************************** */^M
/* Example of a syndication feed reader using the Project Rome API with       */^M
/* BSF4ooRexx                                                                 */^M
/* current version of Rome: rome1.0.jar            https://rome.dev.java.net/ */^M
/* You need to implement this API plus the JDOM API                           */^M
/* jdom.jar  ,   you can find this at               https://jdom.org/        ; */^M
/*                                                                            */^M
/* This is an example of a graphical feed creator                             */^M
/* created by Martin Stoppacher     date:   26.12.2009    (c) 2009            */^M
/* license:ÊÊÊÊLGPL 3.0ÊÊÊÊÊÊÊused versions: Java 1.6, ooRexx 4.0, Bsf4ooRexx */^M
/*             (Lesser Gnu Public License version 3.0),                       */^M
/*             cf. <http://www.gnu.org/licenses/lgpl.html>                    */^M
/* ************************************************************************** */^M
^M
/*                              converting the rexx date() to an other format */^M
datum = date()^M
parse var datum day mounth year^M
if mounth="Dec" then mounth=12^M
if mounth="Jan" then mounth=01              /*  simply add the necessary once */^M
datum_new = year"-"mounth"-"day^M
^M
/*        create a java  SimpleDateFormat instance for entry~setPublishedDate */^M
DATE_PARSER = .bsf~new("java.text.SimpleDateFormat", "yyyy-MM-dd")    ^M
^M
entries =.bsf~new("java.util.ArrayList")^M
^M
= 1^M
^M
f=.bsf~new("javax.swing.JFrame", "Feed Creator!")^M
f~bsf.addEventListener( 'window', 'windowClosing', 'call BSF "exit"')^M
f~setLayout( .bsf~new("java.awt.GridLayout",0,2))^M
^M
input1=.bsf~new("javax.swing.JTextField", "My Feed", 10)^M
input2=.bsf~new("javax.swing.JTextField", "Martin Stoppacher", 10)^M
input3=.bsf~new("javax.swing.JTextField", "", 10)^M
input4=.bsf~new("javax.swing.JTextField", "http://rss.orf.at/fm4.xml", 10)^M
input5=.bsf~new("javax.swing.JTextField", "English", 10)^M
^M
inputtype=.bsf~new("javax.swing.JTextField", "rss_2.0", 10)^M
inputname=.bsf~new("javax.swing.JTextField", "test_1", 10)^M
^M
label1=.bsf~new("javax.swing.JLabel", "Feed Name")^M
label2=.bsf~new("javax.swing.JLabel", "Author")^M
label3=.bsf~new("javax.swing.JLabel", "Description")^M
label4=.bsf~new("javax.swing.JLabel", "Link")^M
label5=.bsf~new("javax.swing.JLabel", "Language")^M
^M
labeltype=.bsf~new("javax.swing.JLabel", "Feed Type")^M
labelname=.bsf~new("javax.swing.JLabel", "File Name")^M
^M
label20=.bsf~new("javax.swing.JLabel", "")^M
label21=.bsf~new("javax.swing.JLabel", "")^M
label22=.bsf~new("javax.swing.JLabel", "")^M
label24=.bsf~new("javax.swing.JLabel", "")^M
^M
add=.bsf~new('javax.swing.JButton', 'Add an Entry')^M
add~bsf.addEventListener( 'action', '', 'call add entries')^M
^M
aggregate=.bsf~new('javax.swing.JButton', 'Aggregate Feeds')^M
aggregate~bsf.addEventListener( 'action', '', 'call aggregate entries, tmpColl')^M
^M
create=.bsf~new('javax.swing.JButton', 'Create Feed as file')^M
create~bsf.addEventListener( 'action', '', 'call create input1, input2, input3, input4, input5, inputtype, entries, inputname')^M
^M
show=.bsf~new('javax.swing.JButton', 'Show feed')^M
--show~bsf.addEventListener( 'action', '', '.createall~new(input1, input2, input3, input4, input5, inputtype)')createall^M
show~bsf.addEventListener( 'action', '', 'call show input1, input2, input3, input4, input5, inputtype, entries')^M
^M
f~add(label1)^M
f~add(input1)^M
f~add(label2)^M
f~add(input2)^M
f~add(label3)^M
f~add(input3)^M
f~add(label4)^M
f~add(input4)^M
f~add(label5)^M
f~add(input5)^M
^M
f~add(label21)^M
f~add(label22)^M
^M
f~add(labeltype)^M
f~add(inputtype)^M
^M
f~add(labelname)^M
f~add(inputname)^M
^M
f~add(add)^M
f~add(aggregate)^M
f~add(create)^M
f~add(show)^M
^M
f~add(label20)^M
f~add(label24)^M
^M
~~pack ~~show ~~toFront^M
^M
do forever^M
        INTERPRET .bsf~bsf.pollEventText^M
        if result="SHUTDOWN, REXX !" then leave^M
end^M
exit^M
^M
show:^M
use arg input1, input2, input3, input4, label5, labeltype, entries^M
^M
feed=.bsf~new("com.sun.syndication.feed.synd.SyndFeedImpl")^M
/*      using syndfeedImpl to creat a feed using the independent object model */^M
feed~setFeedType(inputtype~gettext)^M
/*                                                 sets the type of this feed */^M
^M
feed~setTitle(input1~gettext)^M
feed~setAuthor(input2~gettext)^M
feed~setDescription(input3~gettext)^M
feed~setLink(input4~gettext)^M
feed~setLanguage(input5~gettext)^M
^M
feed~setEntries(entries)^M
^M
output=.bsf~new("com.sun.syndication.io.SyndFeedOutput") ^M
say output~outputString(feed,1)^M
                                ^M
return^M
add:                                                      ^M
use arg entries, ent1, ent2, ent3, ent4, ent5, ent6, ent7, ent8^M
^M
label25=.bsf~new("javax.swing.JLabel", "Add an Entry")^M
label26=.bsf~new("javax.swing.JLabel", "")^M
label27=.bsf~new("javax.swing.JLabel", "")^M
label28=.bsf~new("javax.swing.JLabel", "")^M
label29=.bsf~new("javax.swing.JLabel", "")^M
^M
entlab1=.bsf~new("javax.swing.JLabel", "Entry Title")^M
entlab2=.bsf~new("javax.swing.JLabel", "Entry Date")^M
entlab3=.bsf~new("javax.swing.JLabel", "Entry Link")^M
entlab4=.bsf~new("javax.swing.JLabel", "Entry URI")^M
entlab5=.bsf~new("javax.swing.JLabel", "Entry Author")^M
entlab6=.bsf~new("javax.swing.JLabel", "Entry Description")^M
entlab7=.bsf~new("javax.swing.JLabel", "Entry Category")^M
entlab8=.bsf~new("javax.swing.JLabel", "Set Domain for Cat")^M
^M
ent1=.bsf~new("javax.swing.JTextField", "First Entry", 10)^M
ent2=.bsf~new("javax.swing.JTextField", "2010-01-01", 10)^M
ent3=.bsf~new("javax.swing.JTextField", "http://www.google.com/", 10)^M
ent4=.bsf~new("javax.swing.JTextField", "http://www.google.com/", 10)^M
ent5=.bsf~new("javax.swing.JTextField", "it's me", 10)^M
ent6=.bsf~new("javax.swing.JTextField", "desc", 10)^M
ent7=.bsf~new("javax.swing.JTextField", "Search engine", 10)^M
ent8=.bsf~new("javax.swing.JTextField", "http://www.google.com/", 10)^M
^M
addit=.bsf~new('javax.swing.JButton', 'Add an Entry')^M
addit~bsf.addEventListener( 'action', '', 'call addit ent1, ent2, ent3, ent4, ent5, ent6, ent7, ent8, entries')^M
^M
close=.bsf~new('javax.swing.JButton', 'close add')^M
close~bsf.addEventListener( 'action', '', 'call closeadd')^M
^M
f~add(label25)^M
f~add(label26)^M
^M
f~add(entlab1)^M
f~add(ent1)^M
f~add(entlab2)^M
f~add(ent2)^M
f~add(entlab3)^M
f~add(ent3)^M
f~add(entlab4)^M
f~add(ent4)^M
f~add(entlab5)^M
f~add(ent5)^M
^M
f~add(label27)^M
f~add(label28)^M
^M
f~add(entlab6)^M
f~add(ent6)^M
f~add(entlab7)^M
f~add(ent7)^M
f~add(entlab8)^M
f~add(ent8)^M
^M
f~add(close)^M
f~add(addit)^M
^M
f~add(label29)^M
^M
~~pack ~~show ~~toFront^M
                                                ^M
do forever^M
     INTERPRET .bsf~bsf.pollEventText^M
     if result="SHUTDOWN, REXX !" then leave^M
end^M
exit^M
^M
addit: ^M
use arg ent1, ent2, ent3, ent4, ent5, ent6, ent7, ent8, entries^M
^M
entry =.bsf~new("com.sun.syndication.feed.synd.SyndEntryImpl")^M
^M
entry~setTitle(ent1~gettext)^M
--entry~setPublishedDate(DATE_PARSER~parse(ent2~gettext))   -- datum_new^M
entry~setLink(ent3~gettext)^M
entry~setUri(ent4~gettext)^M
entry~setAuthor(ent5~gettext)^M
^M
description=.bsf~new("com.sun.syndication.feed.synd.SyndContentImpl")^M
description~setType("text/plain")^M
description~setValue(ent6~gettext)^M
entry~setDescription(description)^M
^M
cat =.bsf~new("java.util.ArrayList")^M
category=.bsf~new("com.sun.syndication.feed.synd.SyndCategoryImpl")^M
category~setName(ent7~gettext) ^M
category~       setTaxonomyUri("ent8~gettext") ^M
cat~add(category)^M
entry~setCategories(cat)^M
^M
entries~add(entry)^M
^M
label29~setText("Done!")^M
call syssleep 1^M
label29~setText("")^M
return^M
^M
closeadd:^M
^M
f~remove(label25)^M
f~remove(label26)^M
^M
f~remove(entlab1)^M
f~remove(ent1)^M
f~remove(entlab2)^M
f~remove(ent2)^M
f~remove(entlab3)^M
f~remove(ent3)^M
f~remove(entlab4)^M
f~remove(ent4)^M
f~remove(entlab5)^M
f~remove(ent5)^M
^M
f~remove(label27)^M
f~remove(label28)^M
^M
f~remove(entlab6)^M
f~remove(ent6)^M
f~remove(entlab7)^M
f~remove(ent7)^M
f~remove(entlab8)^M
f~remove(ent8)^M
^M
f~remove(close)^M
f~remove(addit)^M
^M
f~remove(label29)^M
^M
~~pack ~~show ~~toFront^M
                                                ^M
do forever^M
     INTERPRET .bsf~bsf.pollEventText^M
     if result="SHUTDOWN, REXX !" then leave^M
end^M
exit^M
^M
return^M
^M
create:^M
use arg input1, input2, input3, input4, label5, labeltype, entries, inputname^M
^M
fileName = inputname~gettext^M
^M
feed=.bsf~new("com.sun.syndication.feed.synd.SyndFeedImpl")^M
/*      using syndfeedImpl to creat a feed using the independent object model */^M
feed~setFeedType(inputtype~gettext)^M
/*                                                 sets the type of this feed */^M
^M
feed~setTitle(input1~gettext)^M
feed~setAuthor(input2~gettext)^M
feed~setDescription(input3~gettext)^M
feed~setLink(input4~gettext)^M
feed~setLanguage(input5~gettext)^M
^M
if entries~size() != 0^M
then feed~setEntries(entries)^M
^M
writer=.bsf~new("java.io.FileWriter",fileName)^M
output=.bsf~new("com.sun.syndication.io.SyndFeedOutput") ^M
output~output(feed,writer)^M
writer~close()^M
^M
textname = "File has been written"^M
textname2 = "to file: " || fileName^M
label20~setText(textname)^M
label24~setText(textname2)^M
call syssleep 2   ^M
label20~setText("")^M
label24~setText("")                 ^M
                                              ^M
return^M
^M
aggregate:^M
use arg entries, ent9, tmpColl^M
tmpColl = .array ~new^M
^M
label31=.bsf~new("javax.swing.JLabel", "")^M
^M
entlab9=.bsf~new("javax.swing.JLabel", "Enter feed URI")^M
^M
ent9=.bsf~new("javax.swing.JTextField", "http://rss.orf.at/fm4.xml", 10)^M
^M
addagg=.bsf~new('javax.swing.JButton', 'add URI to list')^M
addagg~bsf.addEventListener( 'action', '', 'i=i+1')^M
addagg~bsf.addEventListener( 'action', '', 'tmpColl~put(ent9~gettext, i)')^M
addagg~bsf.addEventListener( 'action', '', 'label31~setText("Done!"); call syssleep(1);label31~setText(""); ')^M
^M
aggshow=.bsf~new('javax.swing.JButton', 'show URIs')^M
aggshow~bsf.addEventListener( 'action', '', 'call aggshow')^M
^M
agg=.bsf~new('javax.swing.JButton', 'add entries to feed')^M
agg~bsf.addEventListener( 'action', '', 'call aggit ent9, entries, tmpColl')^M
^M
closeagg=.bsf~new('javax.swing.JButton', 'close aggregate')^M
closeagg~bsf.addEventListener( 'action', '', 'call closeagg')^M
^M
f~add(entlab9)^M
f~add(ent9)^M
^M
f~add(addagg)^M
f~add(aggshow)^M
f~add(agg)^M
f~add(closeagg)^M
^M
f~add(label31)^M
^M
~~pack ~~show ~~toFront^M
                                                ^M
do forever^M
     INTERPRET .bsf~bsf.pollEventText^M
     if result="SHUTDOWN, REXX !" then leave^M
end^M
exit^M
^M
aggshow:^M
^M
say "your urls are :"^M
^M
DO item OVER tmpColl^M
SAY "[" || item || "]"^M
END^M
^M
return^M
^M
aggit:^M
use arg ent9, entries, tmpColl^M
^M
do y=i-1 to 1 by -1^M
feedUrl=.bsf~new("java.net.URL",tmpColl~at(y))^M
input=.bsf~new("com.sun.syndication.io.SyndFeedInput")^M
xmlr=.bsf~new("com.sun.syndication.io.XmlReader", feedUrl)^M
infeed=input~build(xmlr)^M
^M
entries~addAll(infeed~getEntries())    ^M
end^M
^M
label31~setText("Done!")^M
call syssleep 1   ^M
label31~setText("")^M
^M
return^M
^M
closeagg:^M
^M
f~remove(entlab9)^M
f~remove(ent9)^M
^M
f~remove(addagg)^M
f~remove(aggshow)^M
f~remove(agg)^M
f~remove(closeagg)^M
^M
f~remove(label31)^M
^M
~~pack ~~show ~~toFront^M
                                                ^M
do forever^M
     INTERPRET .bsf~bsf.pollEventText^M
     if result="SHUTDOWN, REXX !" then leave^M
end^M
exit^M
^M
return^M
^M
::requires BSF.cls